// 给定一个整数数组和一个整数 k，你需要找到该数组中和为 k 的连续的子数组的个数。
// 示例 1 :
// 输入:nums = [1,1,1], k = 2
// 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
// 方法一:列举法 这里就不展示
// 方法二：前缀和 + 哈希表优化
class Solution {
    public int subarraySum(int[] nums, int k) {
        int pre = 0;
        int count =0;
        Map<Integer,Integer>map = new HashMap<>();
        map.put(0,1);
        for(int i=0;i<nums.length;i++)
        {
            pre+=nums[i];
            if(map.containsKey(pre-k))
            {
                count+=map.get(pre-k); //nums[j]-nums[i]==k  说明 nums[i]+nums[i+1]+……nums[j]==k (核心)
            }
            map.put(pre,map.getOrDefault(pre,0)+1);
        }
        return count;
    }
}